home *** CD-ROM | disk | FTP | other *** search
-
- { RIPSEE.PAS version 1.0 views a RIP 1.54 in EGA
- Public domain by Jason Dyer, use is free, but it would be nice if you gave
- me credit. Netmail at jason.dyer@solitud.fidonet.org on Internet or 1:300/23
- on Fidonet. If anyone can tell me the REAL way to scroll the graphic part of
- the screen please tell me.
- This program assumes you have TP/BP 7.0+ because of the new fonts it adds.
- If you are using anything less you will have to add the new fonts manually.
- Also, the icon format is different...the "trash byte" isn't used in 6.0.
- A few things are missing, like mouse buttons and the text window...expect
- them in a later version. }
-
- PROGRAM RipSee;
-
- USES Crt, Dos, Graph;
-
- CONST Place : ARRAY [1..5] OF LONGINT = (1, 36, 1296, 46656, 1679616);
- Seq = ('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ');
-
- VAR ErrorCode : INTEGER;
- GrDriver, GrMode : INTEGER;
- f : TEXT;
- SSS : STRING;
- ccol : INTEGER;
- Ch : CHAR;
- Clipboard : POINTER;
- LLL : INTEGER;
- command : STRING;
- RipLine, bslash : BOOLEAN;
-
- FUNCTION FileExists (zzz : STRING) : BOOLEAN;
- VAR DoCheck : SearchRec;
- BEGIN
- FINDFIRST (zzz, AnyFile, DoCheck);
- IF DosError = 0 THEN FileExists := TRUE ELSE FileExists := FALSE;
- END;
-
- PROCEDURE WriteString (SSS : STRING; CP : INTEGER);
- VAR Prloop : INTEGER;
- Regs : REGISTERS;
- BEGIN
- regs.ah := $0E;
- regs.bh := 0;
- regs.bl := cp;
- FOR PrLoop := 1 TO LENGTH (SSS) DO BEGIN
- Regs.Al := ORD (SSS [PrLoop]);
- INTR ($10, Regs);
- END;
- END;
-
- FUNCTION Convert (SS : STRING) : LONGINT;
- VAR PrLoop, Counter : INTEGER;
- CA, Tag : LONGINT;
- BEGIN
- IF LENGTH (ss) = 1 THEN ss := '0' + ss;
- Counter := 0; CA := 0;
- FOR PrLoop := LENGTH (SS) DOWNTO 1 DO BEGIN
- Counter := Counter + 1;
- Tag := POS (SS [PrLoop], Seq) - 1;
- CA := CA + (Tag * Place [Counter]);
- END;
- Convert := CA;
- END;
-
- PROCEDURE DrawBezierCurve (px1, py1, px2, py2, px3, py3, px4, py4, count : INTEGER);
- FUNCTION pow (x : REAL; y : WORD) : REAL;
- VAR
- nt : WORD;
- result : REAL;
- BEGIN
- result := 1;
- FOR nt := 1 TO y DO
- result := result * x;
- pow := result;
- END;
-
- PROCEDURE Bezier (t : REAL; VAR x, y : INTEGER);
- BEGIN
- x := TRUNC (pow (1 - t, 3) * px1 + 3 * t * pow (1 - t, 2) * px2 +
- 3 * t * t * (1 - t) * px3 + pow (t, 3) * px4);
- y := TRUNC (pow (1 - t, 3) * py1 + 3 * t * pow (1 - t, 2) * py2 +
- 3 * t * t * (1 - t) * py3 + pow (t, 3) * py4);
- END;
- VAR
- resolution, t : REAL;
- xc, yc : INTEGER;
- BEGIN
- IF count = 0 THEN EXIT;
- resolution := 1 / count;
- MOVETO (px1, py1);
- t := 0;
- WHILE t < 1 DO BEGIN
- Bezier (t, xc, yc);
- LINETO (xc, yc);
- t := t + resolution;
- END;
- LINETO (px4, py4);
- END;
-
- PROCEDURE Scrollgraph (x1, y1, x2, y2, dest : INTEGER);
- VAR PP : POINTER;
- BEGIN
- IF x1 MOD 8 <> 0 THEN x1 := x1 DIV 8;
- IF x2 MOD 8 <> 0 THEN x2 := (x2 + 8) DIV 8;
- GETMEM (pp, IMAGESIZE (x1, y1, x2, y2) );
- GETIMAGE (x1, y1, x2, y2, pp^);
- PUTIMAGE (x1, dest, pp^, 0);
- DISPOSE (pp);
- END;
-
- PROCEDURE ResetWindows;
- BEGIN
- SETVIEWPORT (0, 0, GETMAXX, GETMAXY, ClipOn);
- CLEARDEVICE; IF clipboard <> NIL THEN DISPOSE (clipboard);
- clipboard := NIL;
- END;
-
- PROCEDURE usersetf;
- VAR ii, jj : INTEGER;
- zz : FillPatternType;
- BEGIN
- jj := 0;
- FOR ii := 1 TO 8 DO BEGIN
- jj := jj + 2;
- zz [ii] := Convert (COPY (command, jj, 2) );
- END;
- SETFILLPATTERN (zz, Convert (COPY (command, 18, 2) ) );
- END;
-
- PROCEDURE DPoly (fillit, ifpoly : BOOLEAN; np : INTEGER);
- VAR ii, zz, yy : INTEGER;
- poly : ARRAY [1..200] OF PointType;
- BEGIN
- ii := 4;
- FOR zz := 1 TO np DO BEGIN
- poly [zz].x := Convert (COPY (command, ii, 2) );
- poly [zz].y := Convert (COPY (command, ii + 2, 2) );
- ii := ii + 4;
- END; IF ifpoly THEN BEGIN
- poly [np + 1] := poly [1];
- IF NOT fillit THEN DRAWPOLY (np + 1, poly) ELSE FILLPOLY (np + 1, poly);
- END ELSE IF NOT fillit THEN DRAWPOLY (np, poly) ELSE FILLPOLY (np, poly);
- END;
-
- PROCEDURE toclip (x1, y1, x2, y2 : INTEGER);
- BEGIN
- IF clipboard <> NIL THEN DISPOSE (clipboard);
- GETMEM (clipboard, IMAGESIZE (x1, y1, x2, y2) );
- GETIMAGE (x1, y1, x2, y2, ClipBoard^);
- END;
-
- PROCEDURE LoadIcon (x, y, mode, cboard : INTEGER; fname : STRING);
- VAR fi : FILE;
- P : POINTER;
- Z : LONGINT;
- tt : TextSettingsType;
- cc : WORD;
- BEGIN
- IF NOT fileexists (fname) THEN BEGIN
- IF cboard = 1 THEN clipboard := NIL;
- GETTEXTSETTINGS (tt); cc := GETCOLOR;
- SETTEXTSTYLE (DefaultFont, HorizDir, 1); SETCOLOR (15);
- OUTTEXTXY (x, y, Fname);
- OUTTEXTXY (x, y + TEXTHEIGHT (Fname), 'not found');
- SETCOLOR (cc); SETTEXTSTYLE (tt.font, tt.direction, tt.charsize);
- END ELSE BEGIN
- ASSIGN (fi, fname); NEW (P);
- RESET (fi);
- z := FILESIZE (fi);
- GETMEM (P, FILESIZE (fi) );
- BLOCKREAD (fi, P^, FILESIZE (fi) );
- CLOSE (fi);
- IF cboard = 1 THEN clipboard := p;
- PUTIMAGE (x, y, p^, mode);
- DISPOSE (p);
- END;
- END;
-
- PROCEDURE allpalette;
- VAR Pal : PaletteType;
- ii, jj : INTEGER;
- BEGIN
- Pal.Size := 16;
- jj := 0;
- FOR ii := 1 TO 16 DO BEGIN
- jj := jj + 2;
- Pal.Colors [ii - 1] := Convert (COPY (command, jj, 2) );
- END;
- SETALLPALETTE (Pal);
- END;
-
- PROCEDURE ParseCommand (command : STRING);
- BEGIN
- IF command = '*' THEN resetwindows;
- IF command [1] = 'W' THEN SetWriteMode (Convert (COPY (command, 2, 2) ) );
- IF command [1] = 'S' THEN SETFILLSTYLE (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 2) ) );
- IF command [1] = 'E' THEN CLEARVIEWPORT;
- IF command [1] = 'v' THEN SETVIEWPORT (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 2) ),
- Convert (COPY (command, 6, 2) ),
- Convert (COPY (command, 8, 2) ), ClipOn);
- IF command [1] = 'c' THEN IF LENGTH (command) = 2 THEN
- BEGIN ccol := (POS (command [2], Seq) - 1); SETCOLOR (ccol); END
- ELSE BEGIN ccol := (Convert (COPY (command, 2, 2) ) ); SETCOLOR (ccol); END;
- IF command [1] = 'Y' THEN SETTEXTSTYLE (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 2) ),
- Convert (COPY (command, 6, 2) ) );
- IF command [1] = 's' THEN usersetf;
- IF command [1] = 'Q' THEN allpalette;
- IF command [1] = '@' THEN OUTTEXTXY (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 2) ),
- COPY (command, 6, LENGTH (command) - 5) );
- IF command [1] = 'F' THEN FLOODFILL (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 2) ),
- Convert (COPY (command, 6, 2) ) );
- IF command [1] = 'C' THEN CIRCLE (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 2) ),
- Convert (COPY (command, 6, 2) ) );
- IF command [1] = 'B' THEN BAR (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 2) ),
- Convert (COPY (command, 6, 2) ),
- Convert (COPY (command, 8, 2) ) );
- IF command [1] = 'A' THEN ARC (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 2) ),
- Convert (COPY (command, 6, 2) ),
- Convert (COPY (command, 8, 2) ),
- Convert (COPY (command, 10, 2) ) );
- IF command [1] = 'I' THEN PIESLICE (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 2) ),
- Convert (COPY (command, 6, 2) ),
- Convert (COPY (command, 8, 2) ),
- Convert (COPY (command, 10, 2) ) );
- IF command [1] = 'i' THEN Sector (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 2) ),
- Convert (COPY (command, 6, 2) ),
- Convert (COPY (command, 8, 2) ),
- Convert (COPY (command, 10, 2) ),
- Convert (COPY (command, 12, 2) ) );
- IF command [1] = 'L' THEN LINE (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 2) ),
- Convert (COPY (command, 6, 2) ),
- Convert (COPY (command, 8, 2) ) );
- IF command [1] = 'R' THEN RECTANGLE (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 2) ),
- Convert (COPY (command, 6, 2) ),
- Convert (COPY (command, 8, 2) ) );
- IF command [1] = 'o' THEN FillEllipse (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 2) ),
- Convert (COPY (command, 6, 2) ),
- Convert (COPY (command, 8, 2) ) );
- IF (command [1] = 'O') OR (command [1] = 'V') THEN
- ELLIPSE (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 2) ),
- Convert (COPY (command, 6, 2) ),
- Convert (COPY (command, 8, 2) ),
- Convert (COPY (command, 10, 2) ),
- Convert (COPY (command, 12, 2) ) );
- IF command [1] = 'P' THEN Dpoly (FALSE, TRUE, Convert (COPY (command, 2, 2) ) );
- IF command [1] = 'p' THEN Dpoly (TRUE, TRUE, Convert (COPY (command, 2, 2) ) );
- IF command [1] = 'X' THEN PUTPIXEL (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 2) ), ccol);
- IF command [1] = 'a' THEN SETPALETTE (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 2) ) );
- IF command [1] = '=' THEN SETLINESTYLE (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 4) ),
- Convert (COPY (command, 8, 2) ) );
- IF command [1] = 'l' THEN Dpoly (FALSE, FALSE, Convert (COPY (command, 2, 2) ) );
- IF command [1] = 'Z' THEN DrawBezierCurve (Convert (COPY (command, 2, 2) ),
- Convert (COPY (command, 4, 2) ),
- Convert (COPY (command, 6, 2) ),
- Convert (COPY (command, 8, 2) ),
- Convert (COPY (command, 10, 2) ),
- Convert (COPY (command, 12, 2) ),
- Convert (COPY (command, 14, 2) ),
- Convert (COPY (command, 16, 2) ),
- Convert (COPY (command, 18, 2) ) );
- IF command [1] = '1' THEN BEGIN {level one commands}
- IF command [2] = 'C' THEN Toclip (Convert (COPY (command, 3, 2) ),
- Convert (COPY (command, 5, 2) ),
- Convert (COPY (command, 7, 2) ),
- Convert (COPY (command, 9, 2) ) );
- IF (command [2] = 'P') AND (Clipboard <> NIL)
- THEN PUTIMAGE (Convert (COPY (command, 3, 2) ),
- Convert (COPY (command, 5, 2) ),
- Clipboard^,
- Convert (COPY (command, 7, 2) ) );
- IF command [2] = 'I' THEN LoadIcon (Convert (COPY (command, 3, 2) ),
- Convert (COPY (command, 5, 2) ),
- Convert (COPY (command, 7, 2) ),
- Convert (COPY (command, 9, 1) ),
- COPY (command, 12, LENGTH (command) - 11) );
- IF command [2] = 'G' THEN Scrollgraph (Convert (COPY (command, 3, 2) ),
- Convert (COPY (command, 5, 2) ),
- Convert (COPY (command, 7, 2) ),
- Convert (COPY (command, 9, 2) ),
- Convert (COPY (command, 13, 2) ) );
- END;
- END;
-
- PROCEDURE Init;
- VAR FName : STRING;
- BEGIN
- clipboard := NIL;
- DETECTGRAPH (GrDriver, Grmode);
- IF GrDriver < 3 THEN BEGIN
- WRITELN ('EGA not detected!');
- HALT (1);
- END; GrMode := vgahi; Grdriver := vga;
- INITGRAPH (GrDriver, GrMode, '\turbo\tp'); { The address of your BGI files }
- ErrorCode := GRAPHRESULT;
- IF ErrorCode <> grOK THEN
- BEGIN
- WRITELN ('Graphics error:');
- WRITELN (GraphErrorMsg (ErrorCode) );
- WRITELN ('Program aborted...');
- HALT (1);
- END;
- Fname := PARAMSTR (1);
- IF POS ('.', Fname) = 0 THEN Fname := Fname + '.RIP';
- IF (NOT FileExists (Fname) ) OR (Fname = '.RIP') THEN BEGIN
- WRITELN ('File not found!');
- HALT (1);
- END;
- CLEARDEVICE; LLL := 0; command := ''; bslash := FALSE;
- ASSIGN (f, Fname); ripline := FALSE; RESET (f);
- END;
-
- BEGIN
- Init;
- REPEAT
- READ (f, Ch);
- IF (ORD (ch) = 13) OR (ORD (ch) = 10) THEN BEGIN
- IF bslash = TRUE THEN BEGIN READ (f, ch); bslash := FALSE;
- END ELSE BEGIN
- LLL := 0; READ (f, ch);
- IF ripline = TRUE THEN ripline := FALSE ELSE
- WriteString (ch, 15);
- END;
- END ELSE BEGIN
- LLL := LLL + 1;
- IF (LLL = 1) AND (Ch = '!') THEN ripline := TRUE ELSE BEGIN
- IF ripline THEN BEGIN
- CASE ch OF
- '|' : BEGIN
- IF bslash THEN BEGIN command := command + ch; bslash := FALSE; END ELSE
- BEGIN
- IF command <> '' THEN ParseCommand (command);
- command := '';
- END;
- END;
- '\' : BEGIN
- IF bslash THEN BEGIN command := command + ch; bslash := FALSE; END ELSE
- bslash := TRUE;
- END;
- ELSE command := command + ch;
- END;
- END ELSE BEGIN
- WriteString (ch, 15);
- END;
- END;
- END;
- UNTIL EOF (f);
- CLOSE (f);
- IF command <> '' THEN ParseCommand (command);
- Ch := READKEY;
- CLOSEGRAPH;
- END.